﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace TestesFixacao.Dominio.Modelos
{
    public class Disciplina
    {
        public int Numero { get; set; }

        public string Nome { get; set; }

        public List<Questao> Questoes = new List<Questao>();

        public void AdicionaQuestao(Questao questao)
        {
            Questoes.Add(questao);
        }

        public Questao BuscaQuestao(int numeroQuestao)
        {
            try
            {
                var questaoEncontrada = Questoes.First(x => x.Numero == numeroQuestao);

                return questaoEncontrada;
            }
            catch (InvalidOperationException ioe)
            {
                throw new QuestaoNaoEncontradaException(numeroQuestao);
            }
            catch (ArgumentNullException ane)
            {
                throw new QuestaoNaoEncontradaException(numeroQuestao);
            }
            catch (Exception ex)
            {
                throw new QuestaoNaoEncontradaException(numeroQuestao);
            }
        }

        public int ObtemQuantidadeQuestoes()
        {
            return Questoes.Count(x => x != null);
        }

        public override string ToString()
        {
            return string.Format("{0} - Quantidade de questões: {1}", Nome, ObtemQuantidadeQuestoes());
        }

        public void RemoveQuestao(int numero)
        {
            Questoes.Remove(BuscaQuestao(numero));
        }

        public void EditaQuestao(Questao questao)
        {
            var questaoAtualizada = Questoes.Single(x => x.Numero == questao.Numero);

            questaoAtualizada.Bimestre = questao.Bimestre;
            questaoAtualizada.Enunciado = questao.Enunciado;
            questaoAtualizada.Numero = questao.Numero;
        }

        public override bool Equals(object obj)
        {
            if (obj is Disciplina == false)
                return false;

            Disciplina disc = (Disciplina)obj;
            if ((disc.Numero == this.Numero) && (disc.Nome == this.Nome))
                return true;

            return false;
        }

        public void Valida()
        {
            if (Nome.Length == 0)
                throw new Exception("Digite o nome da Disciplina.");
        }
    }
}